#include"TcpServer.hpp"
#include"Log.hpp"
#include"InetAddr.hpp"
#include"ThreadPool.hpp"
#include"Route.hpp"
#include"Dict.hpp"
#include<memory>
#include"Command.hpp"
#include <functional>
using namespace kzz;

using task_t =std::function< void () >;

int main(int argc,char **argv)
{
    if (argc != 2)
    {
        kzz::LOG(LogLevel::ERROR) << "服务器端参数传入错误";
        return 2;
    }
    //实现通信功能
    //kzz::ThreadPool<task_t> tp;
    // kzz::ThreadPool<task_t>& tp=*kzz::ThreadPool<task_t> ::GetInstance();
    // tp.Start();
    //实现
    kzz::Route r;
    kzz::Dict d;
     uint16_t port=std::stoi(argv[1]);
    d.LoadDict();
    Command cmd;
    //翻译模块
    //传入的函数应该是让翻译模块去翻译
    //把客户端传来的翻译任务推入线程池
    std::unique_ptr<kzz::TcpServer> tsver=std::make_unique<kzz::TcpServer> (port,
           [&cmd](const std::string &c, InetAddr &addr)
    {
        //std::string ret=kzz::Dict::TransLate(word,addr);
        return cmd.Execute(c,addr);
    }
    //     [&d](const std::string &word, InetAddr &addr)
    // {
    //     //std::string ret=kzz::Dict::TransLate(word,addr);
    //     return d.TransLate(word,addr);
    // }
);
tsver->Init();
tsver->Start();

       // sleep(10000);

//    tp.Stop();
//    tp.Join();

  
     //服务器的function就是把收到的任务通过route的massageroute函数进行回调，
     //把这个回调的操作放入线程池中，让不同的线程去完成不同的回调
   
//     std::unique_ptr<UdpServer> asver=std::make_unique<kzz::UdpServer>(port,
//         [&r,&tp](int sockfd,const std::string& word,InetAddr& addr){
//             task_t t=[&r,&sockfd,&word,&addr](){r.MassageRoute(sockfd,word,addr);};
//             tp.Equeue(t);
//         });
// asver->Init();
// asver->Start();

//         sleep(10000);

//    tp.Stop();
//    tp.Join();
//     // server.Init();
    
    // server.Start();
    return 0;

}